package pruebas;

import java.util.ArrayList;
import junit.framework.TestCase;
import juego.Caza;
import juego.CazaAdaptable;
import juego.Coordenada;
import juego.Energia;
import juego.Impacto;
import juego.Laser;
import juego.Cohete;
import juego.Movil;
import juego.AvionCivil;
import juego.Avioneta;
import juego.Bombardero;
import juego.Explorador;
import juego.Botin;


public class TestCazaAdaptable extends TestCase {

	public void testMovimiento(){
		
		Caza caza = new CazaAdaptable(0,0);
		
		ArrayList<Movil> listaDeMoviles = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		listaDeMoviles.add(caza);
		
		caza.vivir(listaDeMoviles,listaDeBotines);
		
		assertEquals (0, caza.verUbicacion().obtenerCoordenadaX());
		assertEquals (-10, caza.verUbicacion().obtenerCoordenadaY());
		
	};
	
	public void testImpactoProvocado(){
		
		Movil movil = new CazaAdaptable(0,8);
		Energia energia = new Energia(30);
		Impacto impacto = movil.impactoProvocado();
		impacto.herir(energia);
		assertEquals(20, energia.verEnergia());
		
	};
	
	public void testColision(){
	
		ArrayList<Movil> listaDeMoviles = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		
		Caza caza = new CazaAdaptable(0,0);
	
		Coordenada ubicacionLaser = new Coordenada(0,-10);
		Laser laser = new Laser(ubicacionLaser);
		
		Coordenada ubicacionLaser2 = new Coordenada(0,-30);
		Laser laser2 = new Laser(ubicacionLaser2);
		
		laser.hacerLeal();
		laser2.hacerLeal();
		
		listaDeMoviles.add(caza);
		listaDeMoviles.add(laser);
		listaDeMoviles.add(laser2);
		
		int puntaje = 0;
		puntaje = caza.vivir(listaDeMoviles,listaDeBotines);
		assertTrue(listaDeMoviles.contains(caza));
		assertFalse(listaDeMoviles.contains(laser));
		assertTrue(puntaje == 0);
		
		caza.vivir(listaDeMoviles,listaDeBotines);
		
		for (int i = 0; i < 5; i++){
		puntaje = caza.vivir(listaDeMoviles,listaDeBotines);}
		assertFalse(listaDeMoviles.contains(caza));
		assertFalse(listaDeMoviles.contains(laser2));
		assertTrue(puntaje == 30);
		
	};
	
	public void testProvocarHuida(){

		ArrayList<Movil> listaDeMoviles = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		
		Caza caza = new CazaAdaptable(0,0);
		caza.designarGuia();

		Coordenada ubicacionLaser = new Coordenada(0,-7);
		Laser laser = new Laser(ubicacionLaser);
		Coordenada ubicacionCohete = new Coordenada(1,-10);
		Cohete cohete = new Cohete(ubicacionCohete);
		laser.hacerLeal();
		cohete.hacerLeal();
		Coordenada ubicacionCohete2 = new Coordenada(0,-10);
		Cohete cohete2 = new Cohete(ubicacionCohete2);
		cohete2.hacerLeal();
		
		Coordenada ubicacionExplorador = new Coordenada(50,50);
		Explorador explorador = new Explorador(ubicacionExplorador);
		Coordenada ubicacionCaza2 = new Coordenada(40,50);
		Caza caza2 = new Caza(ubicacionCaza2);
		Coordenada ubicacionAvioneta = new Coordenada(30,50);
		Avioneta avioneta = new Avioneta(ubicacionAvioneta);
		Coordenada ubicacionBombardero = new Coordenada(20,50);
		Bombardero bombardero = new Bombardero(ubicacionBombardero);
		AvionCivil avionCivil = new AvionCivil(-100,-100);
		Coordenada ubicacionLaser2 = new Coordenada(100,100);
		Laser laser2 = new Laser(ubicacionLaser2);
		laser.hacerLeal();
		Coordenada ubicacionLaser3 = new Coordenada(10,50);
		Laser laser3 = new Laser(ubicacionLaser3);
		
		listaDeMoviles.add(avionCivil);
		listaDeMoviles.add(explorador);
		listaDeMoviles.add(avioneta);
		listaDeMoviles.add(laser);
		listaDeMoviles.add(caza);
		listaDeMoviles.add(bombardero);
		listaDeMoviles.add(laser3);
		listaDeMoviles.add(laser2);
		listaDeMoviles.add(caza2);
		listaDeMoviles.add(cohete2);
		
		//destruccion
		caza.vivir(listaDeMoviles,listaDeBotines);
		assertFalse(caza.estaVivo());
		assertFalse(listaDeMoviles.contains(caza));
		assertFalse(listaDeMoviles.contains(laser));
		assertFalse(listaDeMoviles.contains(cohete));
	    assertFalse(listaDeMoviles.contains(cohete2));
		
		//huida
		//siguen igual
		avionCivil.vivir(listaDeMoviles,listaDeBotines);
		assertEquals (-95, avionCivil.verUbicacion().obtenerCoordenadaX());
		assertEquals (-100, avionCivil.verUbicacion().obtenerCoordenadaY());
		laser2.vivir(listaDeMoviles, listaDeBotines);
		assertEquals (100, laser2.verUbicacion().obtenerCoordenadaX());
		assertEquals (90, laser2.verUbicacion().obtenerCoordenadaY());
		laser3.vivir(listaDeMoviles, listaDeBotines);
		assertEquals (10, laser3.verUbicacion().obtenerCoordenadaX());
		assertEquals (40, laser3.verUbicacion().obtenerCoordenadaY());
		
		//huyen
		explorador.vivir(listaDeMoviles,listaDeBotines);
		assertEquals (50, explorador.verUbicacion().obtenerCoordenadaX());
		assertEquals (60, explorador.verUbicacion().obtenerCoordenadaY());
		caza2.vivir(listaDeMoviles,listaDeBotines);
		assertEquals (40, caza2.verUbicacion().obtenerCoordenadaX());
		assertEquals (60, caza2.verUbicacion().obtenerCoordenadaY());
		avioneta.vivir(listaDeMoviles,listaDeBotines);
		assertEquals (30, avioneta.verUbicacion().obtenerCoordenadaX());
		assertEquals (65, avioneta.verUbicacion().obtenerCoordenadaY());
		bombardero.vivir(listaDeMoviles,listaDeBotines);
		assertEquals (20, bombardero.verUbicacion().obtenerCoordenadaX());
		assertEquals (55, bombardero.verUbicacion().obtenerCoordenadaY());
			
	};
	
	public void testDejarBotin(){
		
		ArrayList<Movil> listaDeMoviles = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		
		Caza caza = new CazaAdaptable(0,0);
		assertEquals(0, listaDeBotines.size());
		
		Coordenada ubicacionLaser = new Coordenada(0,-7);
		Laser laser = new Laser(ubicacionLaser);
		Coordenada ubicacionCohete = new Coordenada(1,-10);
		Cohete cohete = new Cohete(ubicacionCohete);
		laser.hacerLeal();
		cohete.hacerLeal();
		Coordenada ubicacionCohete2 = new Coordenada(0,-10);
		Cohete cohete2 = new Cohete(ubicacionCohete2);
		cohete2.hacerLeal();
		
		listaDeMoviles.add(laser);
		listaDeMoviles.add(caza);
		listaDeMoviles.add(cohete);
		listaDeMoviles.add(cohete2);
		
		//destruccion
		caza.vivir(listaDeMoviles,listaDeBotines);
		assertFalse(caza.estaVivo());
		assertEquals(1, listaDeBotines.size());
	}
	
	public void testDisparar() {
		ArrayList<Movil> listaDeObjetos = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		
		Coordenada coordExp = new Coordenada(0,0);
		Caza exp = new Caza(coordExp);
		listaDeObjetos.add(exp);
		
		//Originalmente la nave es el unico elemento en la lista
		assertTrue((listaDeObjetos.size()) == 1); 
		
		//Como dispara aumenta la cantidad de elementos en la lista
		exp.vivir(listaDeObjetos,listaDeBotines);
		assertTrue((listaDeObjetos.size()) == 2);
		
		//Las siguientes 4 veces no dispara, por lo 
		//que la cantidad de objetos de mantiene igual
		for (int i=0 ; i<4 ; i++ ){
		exp.vivir(listaDeObjetos,listaDeBotines);
		assertTrue((listaDeObjetos.size()) == 2);} 

		//A la 5ta vez vuelve a disparar, entonces
		//aumenta el numero de elementos otra vez
		exp.vivir(listaDeObjetos,listaDeBotines);
		assertTrue((listaDeObjetos.size()) == 3);
		
	}
}

